﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace CleanToolkit.FieldsExctration
{
    public class FieldsExtractor
    {
        /// <summary>
        /// Chemin d'accès au fichier des définitions de champs
        /// </summary>
        public string FieldsDefFilePath { get; set; }

        /// <summary>
        /// Chmin d'accès au fichier de définition des Ids de champs à extraire
        /// </summary>
        public string NeededFieldsIdsFilePath { get; set; }

        /// <summary>
        /// Processus d'extraction des champs
        /// </summary>
        /// <returns></returns>
        public XDocument ExtractFields()
        {
            XDocument result = new XDocument();
            result.Add(new XElement("SPFields"));
            //---------------------------------------------------

            // On charge les fichiers
            XDocument xSchema = XDocument.Load(FieldsDefFilePath);
            XDocument xFields = XDocument.Load(NeededFieldsIdsFilePath);

            // On charge les listes de chamsp
            IEnumerable<XElement> xSchemaFields =
                xSchema
                .Descendants(CleanConstants.CST_SpNamespace + "Elements")
                .Cast<XElement>()
                .Elements(CleanConstants.CST_SpNamespace + "Field");

            IEnumerable<XElement> xNeededFields =
                xFields
                .Descendants(CleanConstants.CST_SpNamespace + "FieldRef");


            // On parcoure les champs requis pour en extraire les valeurs souhaitées
            foreach (XElement xNeededField in xNeededFields)
            {
                // Recherche du SPField dans le schéma sur la base de son ID
                string s_FieldID = xNeededField.Attribute("ID").Value;
                XElement xSchemaField = xSchemaFields.Where(xe => xe.Attribute("ID").Value.Equals(s_FieldID)).FirstOrDefault();

                if (xSchemaField != null)
                {
                    // Création de la définition de champ
                    XElement exportFieldDef = GetFieldDef(xSchemaField);

                    // Ajout au document de retour
                    result.Element("SPFields").Add(exportFieldDef);
                }
            }

            //---------------------------------------------------
            return result;
        }

        /// <summary>
        /// Création d'une déclaration de SPField sur la base de la déclaration du SPField
        /// </summary>
        /// <param name="xSchemaField"></param>
        /// <returns></returns>
        protected virtual XElement GetFieldDef(XElement xSchemaField)
        {
            throw new NotImplementedException();
        }
    }
}
